<?php
namespace app\model;

use think\Model;

class SystemConfig extends Model
{
    // 设置表名
    protected $name = 'system_config';
    
    // 自动写入时间戳
    protected $autoWriteTimestamp = true;
    
    // 定义时间戳字段名
    protected $createTime = 'create_time';
    protected $updateTime = 'update_time';
    
    // 定义字段信息
    protected $schema = [
        'id'          => 'int',
        'config_name' => 'string',
        'config_key'  => 'string',
        'config_value'=> 'string',
        'config_type' => 'string',
        'group_name'  => 'string',
        'remark'      => 'string',
        'status'      => 'int',
        'create_time' => 'datetime',
        'update_time' => 'datetime'
    ];
    
    /**
     * 配置名称搜索器
     * @param \think\db\Query $query 查询对象
     * @param string $value 搜索值
     */
    public function searchConfigNameAttr($query, $value)
    {
        if (!empty($value)) {
            $query->whereLike('config_name', '%' . $value . '%');
        }
    }
    
    /**
     * 配置键名搜索器
     * @param \think\db\Query $query 查询对象
     * @param string $value 搜索值
     */
    public function searchConfigKeyAttr($query, $value)
    {
        if (!empty($value)) {
            $query->whereLike('config_key', '%' . $value . '%');
        }
    }
    
    /**
     * 配置类型搜索器
     * @param \think\db\Query $query 查询对象
     * @param string $value 搜索值
     */
    public function searchConfigTypeAttr($query, $value)
    {
        if (!empty($value)) {
            $query->where('config_type', $value);
        }
    }
    
    /**
     * 配置分组搜索器
     * @param \think\db\Query $query 查询对象
     * @param string $value 搜索值
     */
    public function searchGroupNameAttr($query, $value)
    {
        if (!empty($value)) {
            $query->where('group_name', $value);
        }
    }
    
    /**
     * 状态搜索器
     * @param \think\db\Query $query 查询对象
     * @param int $value 搜索值
     */
    public function searchStatusAttr($query, $value)
    {
        if (isset($value) && $value !== '') {
            $query->where('status', $value);
        }
    }
    
    /**
     * 获取配置值
     * @param string $key 配置键名
     * @param mixed $default 默认值
     * @return mixed 配置值
     */
    public static function getConfigValue($key, $default = null)
    {
        $config = self::where('config_key', $key)->where('status', 1)->find();
        if (!$config) {
            return $default;
        }
        
        return self::parseValue($config->config_value, $config->config_type);
    }
    
    /**
     * 设置配置值
     * @param string $key 配置键名
     * @param mixed $value 配置值
     * @return bool 是否成功
     */
    public static function setConfigValue($key, $value)
    {
        $config = self::where('config_key', $key)->find();
        if (!$config) {
            return false;
        }
        
        $config->config_value = (string) $value;
        return $config->save();
    }
    
    /**
     * 获取分组的配置列表
     * @param string $group 分组名称
     * @return array 配置列表
     */
    public static function getConfigByGroup($group)
    {
        $configs = self::where('group_name', $group)->where('status', 1)->select();
        $result = [];
        foreach ($configs as $config) {
            $result[$config->config_key] = self::parseValue($config->config_value, $config->config_type);
        }
        return $result;
    }
    
    /**
     * 解析配置值
     * @param string $value 配置值
     * @param string $type 配置类型
     * @return mixed 解析后的值
     */
    private static function parseValue($value, $type)
    {
        switch ($type) {
            case 'int':
                return intval($value);
            case 'float':
                return floatval($value);
            case 'bool':
                return $value == 'true' || $value == '1';
            case 'json':
                return json_decode($value, true);
            case 'array':
                return explode(',', $value);
            default:
                return $value;
        }
    }
} 